package vues;

import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextField;

import modele.ModeleChoixChamps;
import modele.ModeleChoixListe;
import modele.ModeleP;
import controleurs.ChampChoixCOntrolleur;
import controleurs.DescriptifBD;
import controleurs.ListeChoixControleur;
import controleurs.MultiChampsChoixControler;
/**
 * Panneau principale du programme, comprenant la partie concernant les resultats sous forme de liste, et la partie de recherche
 * @author Coudeville
 */
public class MainPanel extends JPanel implements Observer{


	private JPanel smallResearch, advancedResearch, liste, searchPane;
	private CardLayout cl=new CardLayout();
	private String[] listContent={"smallResearch", "advancedResearch"};
	private Dimension minDim=new Dimension(50,23);
	private Dimension prefDim=new Dimension(280, 23);
	private static final long serialVersionUID = -7306372521242838889L;
	/**
	 * Unique Constructeur, permet d'�tablir les dimensions et les positionnement des diff�rents composants
	 * @param modele Le modele Principale
	 */
	public MainPanel(ModeleP modele){
		modele.addObserver(this);
		this.setLayout(new GridBagLayout());
		GridBagConstraints gbc=new GridBagConstraints();
		gbc.gridx=0;
		gbc.gridy=0;
		gbc.fill=GridBagConstraints.BOTH;
		gbc.gridheight=GridBagConstraints.REMAINDER;
		gbc.gridwidth=GridBagConstraints.RELATIVE;
		searchPane=new JPanel();
		smallResearch=createSmallSearchBar(modele);
		advancedResearch=this.createAdvancedSearchBar(modele);
		this.add(searchPane, gbc);
		gbc.gridwidth=GridBagConstraints.REMAINDER;
		searchPane.setLayout(cl);
		searchPane.add(smallResearch, listContent[0]);
		searchPane.add(this.advancedResearch, listContent[1]);
		liste=new ResultFrame(modele, modele.getTableMod());
		this.add(new JSplitPane(JSplitPane.VERTICAL_SPLIT, searchPane, liste));
	}
	/**
	 * Permet de concevoir la premiere partie de la recherche a savoir, la recherche intuitive.
	 * @param modelep Le Modele Principale
	 * @return Un JPanel comportant la barre de recherche simple.
	 */
	public JPanel createSmallSearchBar(ModeleP modelep){
		ModeleChoixListe modelec=new ModeleChoixListe(modelep.getCollec(), modelep);
		JPanel pane=new JPanel();
		pane.setLayout(new GridBagLayout());
		JTextField champR=new JTextField();
		champR.addCaretListener(new ChampChoixCOntrolleur(modelec));
		champR.setPreferredSize(prefDim);
		champR.setMinimumSize(new Dimension(100,23));
		String[] data=modelep.getCollec().getHeadTable(); 
		@SuppressWarnings({"unchecked", "rawtypes"})
		JComboBox type=new JComboBox(data); 
		type.addItemListener(new ListeChoixControleur(modelec));
		JButton changeAdvanced=new JButton("+");
		changeAdvanced.addActionListener(DescriptifBD.changeViews(searchPane, listContent[1], cl));
		GridBagConstraints gbc=new GridBagConstraints();
		gbc.insets=new Insets(1,2,1,2);
		gbc.gridx=0;
		gbc.gridy=0;
		//Taille de la barre de recherche
		gbc.gridheight=1;
		gbc.gridwidth=5;
		pane.add(champR, gbc);
		//Ajout du type
		gbc.gridx=5;
		gbc.gridwidth=2;
		gbc.gridheight=1;
		pane.add(type, gbc);
		//Ajout du bouton +
		gbc.gridx=7;
		gbc.gridwidth=GridBagConstraints.REMAINDER;
		pane.add(changeAdvanced);
		return pane;
	}
	/**
	 * Permet de creer la seconde partie de la recherche, a savoir la recherche avancee.
	 * @return le JPanel de recherche Avance.
	 */
	public JPanel createAdvancedSearchBar(ModeleP modelep){
		ModeleChoixListe modelec=new ModeleChoixListe(modelep.getCollec(), modelep);
		JButton changeSmall=new JButton("-");
		changeSmall.addActionListener(DescriptifBD.changeViews(searchPane, listContent[0], cl));
		JPanel pane=new JPanel();
		JLabel ltitre=new JLabel("Titre : ");
		JLabel ldessinateurs=new JLabel("Dessinateur(s) : ");
		JLabel lediteur=new JLabel("Editeur : ");
		JLabel lannee=new JLabel("Annee : ");
		JLabel lgenre=new JLabel("Genre : ");
		JLabel lnote=new JLabel("Note : ");
		JLabel lauteur=new JLabel("Auteur : ");
		/*String[] listnote={"0", "1", "2", "3", "4","5", "6", "7", "8", "9", "10","11", "12", "13", "14", "15","16","17", "18", "19","20"};
		@SuppressWarnings({"rawtypes", "unchecked"})
		JComboBox bnote=new JComboBox(listnote);*/
		JTextField genres=new JTextField();
		genres.setName("Genres");
		genres.setPreferredSize(prefDim);
		genres.setMinimumSize(minDim);
		JTextField titre=new JTextField();
		titre.setPreferredSize(prefDim);
		titre.setMinimumSize(minDim);
		JTextField auteurs=new JTextField();
		auteurs.setPreferredSize(prefDim);
		auteurs.setMinimumSize(minDim);
		JTextField dessinateurs=new JTextField();
		dessinateurs.setPreferredSize(prefDim);
		dessinateurs.setMinimumSize(minDim);
		JTextField editeur=new JTextField();
		editeur.setMinimumSize(minDim);
		editeur.setPreferredSize(prefDim);
		JTextField annee=new JTextField();
		annee.setMinimumSize(minDim);
		annee.setPreferredSize(minDim);
		JTextField note=new JTextField();
		note.setMinimumSize(minDim);
		note.setPreferredSize(minDim);
		annee.setPreferredSize(minDim);
		//Ajout des name des jtextfield
		titre.setName("titre");
		annee.setName("annee");
		auteurs.setName("auteurs");
		editeur.setName("editeur");
		dessinateurs.setName("dessinateurs");
		genres.setName("genres");
		note.setName("note");
		//Ajout des controlers
		MultiChampsChoixControler contro=new MultiChampsChoixControler(new ModeleChoixChamps(modelep));
		titre.addCaretListener(contro);
		annee.addCaretListener(contro);
		auteurs.addCaretListener(contro);
		editeur.addCaretListener(contro);
		dessinateurs.addCaretListener(contro);
		genres.addCaretListener(contro);
		note.addCaretListener(contro);
		//Positionnement des composants
		pane.setLayout(new GridBagLayout());
		GridBagConstraints gbc=new GridBagConstraints();
		gbc.insets=new Insets(1,2,1,2);
		gbc.ipadx=1;
		gbc.ipady=1;
		gbc.gridx=0;
		gbc.gridy=0;
		gbc.anchor=GridBagConstraints.LINE_START;
		gbc.gridwidth=1;
		pane.add(ltitre, gbc);
		gbc.gridx=1;
		pane.add(titre, gbc);
		gbc.gridx=2;
		pane.add(ldessinateurs, gbc);
		gbc.gridx=3;
		pane.add(dessinateurs, gbc);
		gbc.gridy=1;
		gbc.gridx=0;
		pane.add(lediteur, gbc);
		gbc.gridx=1;
		pane.add(editeur, gbc);
		gbc.gridx=2;
		pane.add(lgenre, gbc);
		gbc.gridx=3;
		pane.add(genres, gbc);
		gbc.gridy=2;
		gbc.gridx=0;
		pane.add(lauteur, gbc);
		gbc.gridx=1;
		pane.add(auteurs, gbc);
		gbc.gridx=2;
		pane.add(lnote, gbc);
		gbc.gridx=3;
		pane.add(note, gbc);
		gbc.gridy=3;
		gbc.gridx=1;
		gbc.gridy=4;
		gbc.gridx=0;
		pane.add(lannee, gbc);
		gbc.gridx=1;
		pane.add(annee, gbc);
		gbc.gridwidth=2;
		gbc.gridwidth=1;
		gbc.gridx=3;
		pane.add(changeSmall, gbc);
		return pane;
	}
	@Override
	public void update(Observable o, Object arg) {
	}
}

